import openpyxl
import os
import sys
from collections import defaultdict
from concurrent.futures import ThreadPoolExecutor, as_completed

def modify_excel(input_file, primary_value, index):
    """根据 A 列 ID 修改对应 I 列数据：第一个设为 primary_value，其余为 2"""
    try:
        workbook = openpyxl.load_workbook(input_file)
        sheet = workbook.active

        id_rows = defaultdict(list)  # 存储每个 ID 出现在哪些行

        row_index = 7  # 从第 7 行开始
        while True:
            cell = sheet[f'A{row_index}']
            if cell.value is None:
                break
            id_rows[str(cell.value)].append(row_index)
            row_index += 1

        for id_value, rows in id_rows.items():
            for i, row in enumerate(rows):
                sheet[f'I{row}'] = primary_value if i == 0 else 1  # 第一个为你输入的值，其余为2

        workbook.save(input_file)
        print(f"✅ [文件 {index}] 成功修改: {os.path.basename(input_file)}")
        return True
    except Exception as e:
        print(f"❌ [文件 {index}] 修改失败: {os.path.basename(input_file)} - 错误: {e}")
        return False

def modify_all_excel_files_in_directory(directory, primary_value, max_workers=5):
    found_files = [f for f in os.listdir(directory) if f.endswith(".xlsx")]

    if not found_files:
        print("⚠️ 当前目录下没有找到 .xlsx 文件！")
        return

    total_files = len(found_files)
    print(f"📂 发现 {total_files} 个 .xlsx 文件，开始修改...\n")

    success_count = 0
    fail_count = 0

    with ThreadPoolExecutor(max_workers=max_workers) as executor:
        future_to_file = {
            executor.submit(modify_excel, os.path.join(directory, file), primary_value, i + 1): file
            for i, file in enumerate(found_files)
        }

        for future in as_completed(future_to_file):
            if future.result():
                success_count += 1
            else:
                fail_count += 1

    print("\n📊 修改任务完成！")
    print(f"✅ 成功修改: {success_count} 个文件")
    print(f"❌ 失败修改: {fail_count} 个文件")

if __name__ == "__main__":
    if getattr(sys, 'frozen', False):
        script_directory = os.path.dirname(sys.executable)
    else:
        script_directory = os.path.dirname(os.path.abspath(__file__))

    converted_directory = os.path.join(script_directory, 'converted')
    
    if not os.path.exists(converted_directory):
        print("⚠️ 没有找到 'converted' 文件夹！")
        sys.exit(1)

    while True:
        new_value = input("\n🔢 请输入「第一个 ID 要填入的数字」（例如 8），输入 'exit' 退出: ")
        if new_value.lower() == "exit":
            print("👋 退出程序！")
            break
        if not new_value.isdigit():
            print("⚠️ 请输入一个有效数字！")
            continue

        modify_all_excel_files_in_directory(converted_directory, int(new_value), max_workers=1)




# import openpyxl  # 用于读取和修改 Excel 文件（.xlsx）
# import os        # 用于处理文件路径、文件夹等操作
# import sys       # 用于处理脚本路径、退出程序等功能
# from collections import defaultdict  # 提供带默认值的字典
# from concurrent.futures import ThreadPoolExecutor, as_completed  # 用于并发处理多个文件

# # --------------------------------------
# # 修改单个 Excel 文件的函数
# # --------------------------------------
# def modify_excel(input_file, primary_value, index):
#     """
#     修改 Excel 中 I 列的值：
#     - 对于 A 列中每个 ID，第一个出现的设置为 primary_value
#     - 其余相同 ID 的设置为 2
#     """
#     try:
#         # 加载 Excel 文件
#         workbook = openpyxl.load_workbook(input_file)
#         sheet = workbook.active  # 默认使用第一个工作表

#         id_rows = defaultdict(list)  # 创建一个字典，每个 ID 对应多个行号

#         row_index = 7  # 从第7行开始读取数据
#         while True:
#             cell = sheet[f'A{row_index}']  # 读取 A 列的单元格，比如 A7, A8...
#             if cell.value is None:
#                 break  # 遇到空行就停止

#             # 把这个 ID 所在的行号添加进字典
#             id_rows[str(cell.value)].append(row_index)
#             row_index += 1

#         # 遍历每个 ID 和它出现的行号列表
#         for id_value, rows in id_rows.items():
#             for i, row in enumerate(rows):
#                 # 第一个出现的设置为 primary_value，其余设置为 2
#                 sheet[f'I{row}'] = primary_value if i == 0 else 2

#         workbook.save(input_file)  # 保存 Excel 文件
#         print(f"✅ [文件 {index}] 成功修改: {os.path.basename(input_file)}")
#         return True
#     except Exception as e:
#         # 如果出错，打印错误信息
#         print(f"❌ [文件 {index}] 修改失败: {os.path.basename(input_file)} - 错误: {e}")
#         return False


# # --------------------------------------
# # 并发处理一个目录下的所有 Excel 文件
# # --------------------------------------
# def modify_all_excel_files_in_directory(directory, primary_value, max_workers=5):
#     """
#     查找目录下所有 .xlsx 文件，并并发修改它们
#     - directory: 文件夹路径
#     - primary_value: 用户输入的值，用于每个 ID 第一个的赋值
#     - max_workers: 同时处理的线程数，默认为5（你设成了1）
#     """
#     found_files = [f for f in os.listdir(directory) if f.endswith(".xlsx")]

#     if not found_files:
#         print("⚠️ 当前目录下没有找到 .xlsx 文件！")
#         return

#     total_files = len(found_files)
#     print(f"📂 发现 {total_files} 个 .xlsx 文件，开始修改...\n")

#     success_count = 0  # 成功数量
#     fail_count = 0     # 失败数量

#     # 使用线程池并发执行
#     with ThreadPoolExecutor(max_workers=max_workers) as executor:
#         # 提交任务：为每个文件创建一个线程
#         future_to_file = {
#             executor.submit(modify_excel, os.path.join(directory, file), primary_value, i + 1): file
#             for i, file in enumerate(found_files)
#         }

#         # 收集执行结果
#         for future in as_completed(future_to_file):
#             if future.result():
#                 success_count += 1
#             else:
#                 fail_count += 1

#     print("\n📊 修改任务完成！")
#     print(f"✅ 成功修改: {success_count} 个文件")
#     print(f"❌ 失败修改: {fail_count} 个文件")


# # --------------------------------------
# # 主程序入口
# # --------------------------------------
# if __name__ == "__main__":
#     # 判断当前脚本运行方式（是否打包成了 .exe）
#     if getattr(sys, 'frozen', False):
#         script_directory = os.path.dirname(sys.executable)  # exe 所在目录
#     else:
#         script_directory = os.path.dirname(os.path.abspath(__file__))  # 脚本所在目录

#     # 拼接 converted 文件夹的路径
#     converted_directory = os.path.join(script_directory, 'converted')

#     # 检查文件夹是否存在
#     if not os.path.exists(converted_directory):
#         print("⚠️ 没有找到 'converted' 文件夹！")
#         sys.exit(1)

#     # 无限循环，允许你重复输入不同的值
#     while True:
#         new_value = input("\n🔢 请输入「第一个 ID 要填入的数字」（例如 8），输入 'exit' 退出: ")
#         if new_value.lower() == "exit":
#             print("👋 退出程序！")
#             break

#         # 如果不是数字，提醒重新输入
#         if not new_value.isdigit():
#             print("⚠️ 请输入一个有效数字！")
#             continue

#         # 调用修改函数，处理所有 Excel 文件
#         modify_all_excel_files_in_directory(converted_directory, int(new_value), max_workers=1)
